//找出所有和等于目标数的不重复组合。
function combinationSum2(candidates, target) {
    candidates.sort((a, b) => a - b);
    const result = [];
    const backtrack = (path, sumSoFar, index) => {
        if (sumSoFar === target) {
            result.push([...path]);
            return;
        }
        if (sumSoFar > target) {
            return;
        }
        for (let i = index; i < candidates.length; i++) {
            if (i > index && candidates[i] === candidates[i - 1]) {
                continue;
            }
            path.push(candidates[i]);
            backtrack(path, sumSoFar + candidates[i], i + 1);
            path.pop();
        }
    };
    backtrack([], 0, 0);
    return result;
}

// 示例1测试
const candidates1 = [100, 10, 20, 70, 60, 10, 50];
const target1 = 80;
console.log(combinationSum2(candidates1, target1));

// 示例2测试
const candidates2 = [2];
const target2 = 1;
console.log(combinationSum2(candidates2, target2));


// 代码解释：
// 首先对 candidates 数组进行排序，这是为了方便后续去重以及按照非递减顺序构建组合。
// 定义 backtrack 回溯函数，它接受当前已选择的数字组合 path、当前组合的数字和 sumSoFar 
// 以及当前搜索到的索引 index 作为参数。
// 当 sumSoFar 等于 target 时，将当前组合 path 的副本（使用展开运算符 ... 复制数组）
// 添加到 result 结果数组中。
// 当 sumSoFar 大于 target 时，直接返回，不再继续探索。
// 在遍历 candidates 数组时，从 index 位置开始，通过 if (i > index && 
// candidates[i] === candidates[i - 1]) 条件跳过重复的数字，避免生成重复的组合。
// 然后将当前数字加入 path，更新 sumSoFar，并递归调用 backtrack 函数继续探索下一个数字。
// 递归返回后，将当前数字从 path 中移除，实现回溯。
// 最后调用 backtrack 函数开始搜索，初始时 path 为空数组，sumSoFar 为 0，index 为 0，
// 并返回最终的结果数组 result。
